02. 软件开发和优化

软件开发

编写功能正常的代码当然是软件开发者的首要目标。在有些应用中,代码效率可能非常重要。

代码开发过程可以分解为以下步骤:

  • 代码设计
  • 设计部署
  • 测试和故障修复
  • 优化

关于这些步骤(设计、部署、测试)的详细说明,请参见 链接

之前讲过,代码优化包括很多方面,涉及到硬件、编译器、算法和 C++ 语言本身。本课中,我们重点研究 C++ 语言。你刚刚学过的 CPU 和 RAM 知识有助于你了解代码为什么可以运行更快。

你将有机会了解并应用一些可以让 C++ 运行更快的技巧。每个练习都提供了一个“较慢的”代码版本,以及让代码更快的技巧。你需要应用该技巧,然后查看代码运行速度有多大提升。这些技巧并不是优化 C++ 代码的所有方式,但可以帮助你了解内存、CPU 和编码选择是如何影响代码运行速度的。

在课程最后,你会收到一些文件,它们构成了一个可正常工作的 C++ 直方图滤波器。你的任务,是使用本课学到的技巧,让直方图滤波器代码运行更快。

如何优化:测试 vs 直觉

要优化你的代码,你需要靠测试和验证,而不是直觉!

测试你的代码,找到在时间、内存和电力使用方面最低效的区域。然后,确认你做的所有变更的确让代码更高效了。如果你先测试,你可能发现,你的代码可能已经足够高效,可以满足应用要求了。

如果你在优化大量代码,你可能需要使用分析器 (Profiler) 工具。Profiler 是一个软件,可以测量部分代码执行所需时间或代码使用多少资源。它能帮助你找到拥塞点,让你先优化最低效的代码部分。

Visual Studio 和 Xcode 都带有分析器。以下链接提供了相关介绍:

使用标准时钟测试你的代码

在下面的练习中,我们为你设置了一些简单的代码。你需要测量使用 C++ 标准时钟运行函数需要多久。

优化方式为:

  • 测量函数运行所需时间
  • 修改部分代码
  • 再次运行代码,检查速度有无提升

分析代码已经为你设置好了,看起来是这样的:

#include <ctime>

std::clock_t start;
double duration;

start = std::clock();

function_name(var1, var2);

duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

std::cout << "duration milliseconds initialize beliefs " << 1000 * duration << '\n';

代码首先存储当前的标准时钟时间,然后运行函数,然后计算所用的时间。

标准库始终使用 时钟周期 测量时间。时钟周期类似计数器变量,随时间以恒定速率增加。但时间长度因系统而异。因此,除以常量 CLOCKS_PER_SEC 后,即可得到以秒为单位的结果。CLOCKS_PER_SEC 变量在 ctime 库中定义。

编程最重要的部分

编程中最重要的部分一般是什么?

SOLUTION: 获得符合功能预期的代码

时钟周期

判断:调用 std::clock() 之间的时间间隔等于真实世界中消逝的时间。

SOLUTION: